home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Java Primer Plus
/
Java Primer Plus (Waite Group Proess)(1996).iso
/
chapter17
/
linkedlist.java
< prev
next >
Wrap
Text File
|
1995-12-31
|
6KB
|
269 lines
import java.util.Enumeration;
/* Linked List class */
class linkedList {
linkedListEntry beginning = null;
linkedListEntry end = null;
int numelements;
linkedList() {}
/* Append a node to the end of the list */
public void append(Object someobject) {
if (someobject == null)
throw new NullPointerException();
linkedListEntry newelement = new linkedListEntry(someobject);
numelements++;
/* Handle if list happens to be empty */
if (end == null) { end = newelement;
beginning = newelement;
}
else {
end.next = newelement;
newelement.prev = end;
end = newelement;
}
}
/* Insert after a specified object */
public void insertAfter(Object afterobject,Object someobject) {
if ((someobject == null) || (afterobject == null))
throw new NullPointerException();
/* Find this object to insert after */
linkedListEntry afterentry = getref(afterobject);
/* uhoh...trouble, object wasn't on the list */
if (afterentry == null)
throw new NullPointerException();
numelements++;
linkedListEntry newelement = new linkedListEntry(someobject);
newelement.next = afterentry.next;
newelement.prev = afterentry;
if (afterentry == end) end = newelement;
else afterentry.next.prev = newelement;
afterentry.next = newelement;
}
/* Insert before a specified object */
public void insertBefore(Object beforeobject,Object someobject) {
if ((someobject == null) || (beforeobject == null))
throw new NullPointerException();
/* Find the object to insert before */
linkedListEntry beforeentry = getref(beforeobject);
if (beforeentry == null)
throw new NullPointerException();
numelements++;
linkedListEntry newelement = new linkedListEntry(someobject);
newelement.next = beforeentry;
newelement.prev = beforeentry.prev;
if (beforeentry == beginning) beginning = newelement;
else beforeentry.prev.next = newelement;
beforeentry.prev = newelement;
}
/* Delete a node */
public void delete(Object someobject) throws
NullPointerException {
if (someobject == null)
throw new NullPointerException();
linkedListEntry delentry = getref(someobject);
if (delentry == null)
throw new NullPointerException();
numelements--;
/* Reroute the pointers around this object */
/* (let the garbage collector come along and actually destroy it */
if (delentry != beginning) delentry.prev.next = delentry.next;
else beginning = delentry.next;
if (delentry != end) delentry.next.prev = delentry.prev;
else end = delentry.prev;
}
public Object previous(Object someobject) {
if (someobject == null)
throw new NullPointerException();
linkedListEntry preventry = getref(someobject);
if (preventry == null)
throw new NullPointerException();
return preventry.prev.node;
}
/* return the next object in the list */
public Object next(Object someobject) {
if (someobject == null)
throw new NullPointerException();
linkedListEntry nextentry = getref(someobject);
if (nextentry == null)
throw new NullPointerException();
return nextentry.next.node;
}
/* Find an entry in the list */
private linkedListEntry getref(Object someobject) {
if (beginning == null) return null;
linkedListEntry runner = beginning;
do {
if (runner.node == someobject) return runner;
runner = runner.next;
} while (runner != null);
return null;
}
/* does a given node exist?? */
public boolean isPresent(Object someobject) {
if (someobject == null)
throw new NullPointerException();
return (getref(someobject) == null) ? false : true;
}
/* Setup the enumeration */
public synchronized Enumeration elements() {
return new linkedListEnumerator(this);
}
}
/* Linked list enumerator class */
class linkedListEnumerator implements Enumeration {
linkedListEntry position;
linkedListEnumerator(linkedList L) {
position = L.beginning;
}
/* standard enumeration method */
public boolean hasMoreElements() {
return (position != null ) ? true : false;
}
/* return next */
public Object nextElement() {
if (position == null) throw new NullPointerException();
linkedListEntry retpos = position;
position = position.next;
return retpos.node;
}
}
/* Linked List Entry class - i.e. a "node" in the list */
class linkedListEntry {
Object node = null;
linkedListEntry next = null;
linkedListEntry prev = null;
linkedListEntry(Object someobject) {
node = someobject;
}
}
/* Test classes */
class listme {
String valname;
listme(String v) {
valname = v; }
public void printmyval() {
System.out.println(valname);
}
}
/* Test the classes out */
class test {
static public void main(String args[]) {
linkedList theList = new linkedList();
listme T = new listme("five");
listme S = new listme("three");
listme U = new listme("two");
listme V = new listme("seven");
listme X = new listme("four");
listme Y = new listme("six");
theList.append(T);
theList.append(S);
theList.append(U);
theList.insertAfter(T,V);
theList.insertBefore(T,X);
theList.append(Y);
theList.delete(Y);
System.out.println("Done Addin");
T = (listme)theList.next(X);
T.printmyval();
System.out.println();
System.out.println();
Enumeration E = theList.elements();
while (E.hasMoreElements()) {
T = (listme)E.nextElement();
T.printmyval();
}
}
}